package com.ushine.design.design.a_creative_mode.f_single.c_lazy;

/**
 * 懒汉式单例
 *
 * @author yls
 */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {

    }


    //使用syncronized关键字对方法加锁，确保任意时刻只有一个线程可以执行该方法。
    synchronized public static LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }


    /**
     * volatile修饰的成员变量可以确保多个线程能够正确处理，JDK1.5及其以上版本中才能正确执行。
     */
    private volatile static LazySingleton instanceByTwoLock = null;

    /**
     * 双重锁
     */
    public static LazySingleton getInstanceByTwoLock() {
        //第一重判断
        if (instanceByTwoLock == null) {
            //锁定代码块
            synchronized (LazySingleton.class) {
                //第二重判断
                if (instanceByTwoLock == null) {
                    instanceByTwoLock = new LazySingleton();
                }
            }
        }

        return instanceByTwoLock;
    }

}
